package main

import (
	"bufio"
	"fmt"
	"io"
	"os"
	"strconv"
	"strings"
)

// 文件 products12.3.txt 的内容如下：

// "The ABC of Go";25.5;1500
// "Functional Programming with Go";56;280
// "Go for It";45.9;356
// "The Go Way";55;500

// 每行的第一个字段为标题，第二个字段为价格，第三个字段为数量。
// 内容的格式基本与 示例 12.3c 的相同，除了分隔符改成了分号。
// 请读取出文件的内容，创建一个结构用于存取一行的数据，然后使用结构的切片，并把数据打印出来。

type line struct {
	title string
	price float64
	count int
}

func main() {
	file, err := os.Open("products12.3.txt")
	if err != nil {
		fmt.Println("File Open Error: ", err.Error())
		return
	}
	defer file.Close()
	lines := make([]line, 1)
	reader := bufio.NewReader(file)
	for {
		linestr, err := reader.ReadString('\n')
		one := new(line)
		if err == io.EOF {
			break
		} else if err != nil {
			fmt.Println("reader error: ", err.Error())
			continue
			// return
		}
		linestr = strings.TrimRight(linestr, "\n")
		linearr := strings.Split(linestr, ";")
		one.title = linearr[0]
		one.price, err = strconv.ParseFloat(linearr[1], 32)
		if err != nil {
			fmt.Println("error of parse flout32: ", err.Error())
		}
		one.count, err = strconv.Atoi(linearr[2])
		if err != nil {
			fmt.Println("error of parse int: ", err.Error())
		}
		if lines[0].title == "" {
			lines[0] = *one
		} else {
			lines = append(lines, *one)
		}
	}

	fmt.Println("读取内容: ")
	for _, v := range lines {
		fmt.Println(v)
	}
}
